package ebj.common.collection;

/**
 * hashset底层的数据结构是hash表，hash表实现方式采用数组+链表，数组类型为HashNode，
 * 每个数组元素为链表的头指针，链表中存储经过hash函数散列后冲突的元素，
 * 数组的长度为26hashset存储的元素类型为字符串，取每个字符串的首字符的ascall码作为hash函数的输入，
 * 数组的长度为10，散列函数h(x)=x%10。
 * @author ZhouXY
 *
 */
public class MyHashSet {
	private HashNode[] nodes = new HashNode[10];
	private int size = 0;

	public MyHashSet() {
		for (int i = 0; i < nodes.length; i++) {
			nodes[i] = new HashNode();
		}
	}

	public boolean add(String value) {
		if (contains(value)) { // 如果有这个元素，就不插入
			return false;
		}
		HashNode node = new HashNode(value, null);
		int index = (int) value.charAt(0) % nodes.length; // 取第一个字符作为hash函数的输入

		// 如果该链为空，直接插入，否则采用头插法
		if (nodes[index].getNext() == null) {
			nodes[index].setNext(node);
		} else {
			node.setNext(nodes[index].getNext());
			nodes[index].setNext(node);
		}
		size++;
		return true;
	}

	public boolean remove(String value) {
		if (!contains(value)) {
			return false;
		}
		int index = (int) value.charAt(0) % nodes.length;
		HashNode node = nodes[index];
		HashNode node2 = node.getNext();
		while (node2 != null) {
			if (node2.getMsg().equals(value)) {
				node.setNext(node2.getNext());
				size--;
				break;
			}
			node = node.getNext();
			node2 = node.getNext();
		}
		return true;
	}

	public void display() {
		for (int i = 0; i < nodes.length; i++) {
			HashNode node = nodes[i].getNext();
			System.out.print(i + " :");
			while (node != null) {
				System.out.print(node.getMsg() + "  ");
				node = node.getNext();
			}
			System.out.println();
		}
	}

	public int size() {
		return size;
	}

	public boolean contains(String value) {
		int index = (int) value.charAt(0) % nodes.length;
		HashNode node = nodes[index].getNext();
		while (node != null) {
			if (node.getMsg().equals(value)) {
				return true;
			}
			node = node.getNext();
		}
		return false;
	}
}
